home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / das / ops.c < prev    next >
C/C++ Source or Header  |  1997-09-09  |  26KB  |  555 lines

  1. /*
  2.  *    (c)Copyright 1992-1997 Obvious Implementations Corp.  Redistribution and
  3.  *    use is allowed under the terms of the DICE-LICENSE FILE,
  4.  *    DICE-LICENSE.TXT.
  5.  */
  6.  
  7. /*
  8.  *  OPS.C
  9.  *
  10.  */
  11.  
  12. #ifndef DISOBJ_C
  13.  
  14. #include "defs.h"
  15.  
  16. Prototype int    ophash(ubyte *);
  17. Prototype void    InitOps(void);
  18. Prototype OpCod *GetOpByName(char *);
  19. Prototype short GetInstSize(MachCtx *);
  20.  
  21. #endif
  22.  
  23.  
  24. /*
  25.  *  The # of extension words is modified by various other parameters extracted from the EffAddr.ExtWord
  26.  *
  27.  *  -1 indicates immediate mode special
  28.  *  -2 indicates index mode special
  29.  */
  30.  
  31.  
  32. short ExtWords[32] = {
  33.               0,  0, 0, 0, 0, 0,  1, -2, 1,2,1,-2,-1,  1,-1, 1, 0, 0, 0,  0,0,0,0,0,0,0,0,0,0,0,0,0,
  34.              };
  35.  
  36. short RegCode[32]  = {     -1, -1,-1,-1,-1,-1, -1,-1, 0,1,2,3, 4, -1,-1,-1,-1,-1,-1, };
  37. short EACode[32]   = {     -1,  0, 1, 2, 3, 4,  5, 6, 7,7,7,7, 7, -1,-1,-1,-1,-1,-1, };
  38. short PCRel[32]    = {      0,  0, 0, 0, 0, 0,  0, 0, 0,0,1,1, 0,  0, 1, 1, 0, 0, 0, };
  39.  
  40.  
  41. #ifndef DISOBJ_C
  42.  
  43. OpCod    *OHash[OSIZE];
  44.  
  45. #endif
  46.  
  47. /*
  48.  *  OpCodes.  Ordering within a group (e.g. OpADD) determines which one is
  49.  *          accepted first.. specifically, when Siz = -1 the opcode can
  50.  *          be accepted without a size specification tag so be careful
  51.  *          about order.  E.G. word branches before byte branches, etc...
  52.  *
  53.  *          warning: branch ordering in array assumed to be
  54.  *          word, then byte (see passc.c branch opt)
  55.  *
  56.  *  Can't make this const because it is modified!
  57.  *
  58.  *  NOTE:   branches must be ordered WBRANCH/BBRANCH (see passc.c)
  59.  */
  60.  
  61. OpCod    Codes[] = {
  62.  
  63.     /*        opcode     Temp    Rs  EAs Rd  EAd Siz Sizes  SModes    DModes      Spec# */
  64.  
  65.     {    "ABCD", OpABCD, 0xC100, 0,  -1, 9,  -1, -1, S_B,    AF_DN,      AF_DN           },
  66.     {    "ABCD", OpABCD, 0xC108, 0,  -1, 9,  -1, -1, S_B,    AF_MMIND,   AF_MMIND        },
  67.     {    "ADD",  OpADD,  0xD000, 0,   3, 9,  -1,  6, S_ALL,  AF_ALL,     AF_DN           },
  68.     {    "ADD",  OpADD,  0xD100, 9,  -1, 0,   3,  6, S_ALL,  AF_DN,      AF_ALTM         },
  69.     {    "ADDA", OpADD,  0xD0C0, 0,   3, 9,  -1, -1, S_W,    AF_ALL,     AF_AN           },
  70.     {    "ADDA", OpADD,  0xD1C0, 0,   3, 9,  -1, -1, S_L,    AF_ALL,     AF_AN           },
  71.     {    "ADDI", OpADD,  0x0600, -1, -1, 0,   3,  6, S_ALL,  AF_IMM,     AF_ALTNA        },
  72.     {    "ADDQ", OpADDQ, 0x5000, -1, -1, 0,   3,  6, S_ALL,  AF_IMM,     AF_ALT  ,  IMM18},
  73.     {    "ADDX", OpADDX, 0xD100, 0,  -1, 9,  -1,  6, S_ALL,  AF_DN,      AF_DN           },
  74.     {    "ADDX", OpADDX, 0xD108, 0,  -1, 9,  -1,  6, S_ALL,  AF_MMIND,   AF_MMIND        },
  75.     {    "AND",  OpAND,  0xC000, 0,   3, 9,  -1,  6, S_ALL,  AF_ALLNA,   AF_DN           },
  76.     {    "AND",  OpAND,  0xC100, 9,  -1, 0,   3,  6, S_ALL,  AF_DN,      AF_ALTM         },
  77.     {    "ANDI", OpAND,  0x0200, -1, -1, 0,   3,  6, S_ALL,  AF_IMM,     AF_ALTNA        },
  78.     {    "ANDI", OpAND,  0x023C, -1, -1, -1, -1, -1, S_B,    AF_IMM,     AF_CCR          },
  79.     {    "ANDI", OpAND,  0x027C, -1, -1, -1, -1, -1, S_W,    AF_IMM,     AF_SR           },
  80.     {    "ASL",  OpASL,  0xE120, 9,  -1, 0,  -1,  6, S_ALL,  AF_DN,      AF_DN           },
  81.     {    "ASL",  OpASL,  0xE100, -1, -1, 0,  -1,  6, S_ALL,  AF_IMM,     AF_DN   ,  IMM18},
  82.     {    "ASL",  OpASL,  0xE1C0, -1, -1, 0,   3, -1, S_W,    0,          AF_ALTM         },
  83.     {    "ASR",  OpASR,  0xE020, 9,  -1, 0,  -1,  6, S_ALL,  AF_DN,      AF_DN           },
  84.     {    "ASR",  OpASR,  0xE000, -1, -1, 0,  -1,  6, S_ALL,  AF_IMM,     AF_DN   ,  IMM18},
  85.     {    "ASR",  OpASR,  0xE0C0, -1, -1, 0,   3, -1, S_W,    0,          AF_ALTM         },
  86.  
  87.     {    "BCC",  OpBCC,  0x6400, -1, -1, -1, -1, -1, S_W,    AF_WBRANCH,  0               },
  88.     {    "BCC",  OpBCC,  0x6400, -1, -1, -1, -1, -1, S_B,    AF_BBRANCH,  0               },
  89.     {    "BCS",  OpBCS,  0x6500, -1, -1, -1, -1, -1, S_W,    AF_WBRANCH,  0               },
  90.     {    "BCS",  OpBCS,  0x6500, -1, -1, -1, -1, -1, S_B,    AF_BBRANCH,  0               },
  91.     {    "BEQ",  OpBEQ,  0x6700, -1, -1, -1, -1, -1, S_W,    AF_WBRANCH,  0               },
  92.     {    "BEQ",  OpBEQ,  0x6700, -1, -1, -1, -1, -1, S_B,    AF_BBRANCH,  0               },
  93.     {    "BGE",  OpBGE,  0x6C00, -1, -1, -1, -1, -1, S_W,    AF_WBRANCH,  0               },
  94.     {    "BGE",  OpBGE,  0x6C00, -1, -1, -1, -1, -1, S_B,    AF_BBRANCH,  0               },
  95.     {    "BGT",  OpBGT,  0x6E00, -1, -1, -1, -1, -1, S_W,    AF_WBRANCH,  0               },
  96.     {    "BGT",  OpBGT,  0x6E00, -1, -1, -1, -1, -1, S_B,    AF_BBRANCH,  0               },
  97.     {    "BHI",  OpBHI,  0x6200, -1, -1, -1, -1, -1, S_W,    AF_WBRANCH,  0               },
  98.     {    "BHI",  OpBHI,  0x6200, -1, -1, -1, -1, -1, S_B,    AF_BBRANCH,  0               },
  99.     {    "BLE",  OpBLE,  0x6F00, -1, -1, -1, -1, -1, S_W,    AF_WBRANCH,  0               },
  100.     {    "BLE",  OpBLE,  0x6F00, -1, -1, -1, -1, -1, S_B,    AF_BBRANCH,  0               },
  101.     {    "BLS",  OpBLS,  0x6300, -1, -1, -1, -1, -1, S_W,    AF_WBRANCH,  0               },
  102.     {    "BLS",  OpBLS,  0x6300, -1, -1, -1, -1, -1, S_B,    AF_BBRANCH,  0               },
  103.     {    "BLT",  OpBLT,  0x6D00, -1, -1, -1, -1, -1, S_W,    AF_WBRANCH,  0               },
  104.     {    "BLT",  OpBLT,  0x6D00, -1, -1, -1, -1, -1, S_B,    AF_BBRANCH,  0               },
  105.     {    "BMI",  OpBMI,  0x6B00, -1, -1, -1, -1, -1, S_W,    AF_WBRANCH,  0               },
  106.     {    "BMI",  OpBMI,  0x6B00, -1, -1, -1, -1, -1, S_B,    AF_BBRANCH,  0               },
  107.     {    "BNE",  OpBNE,  0x6600, -1, -1, -1, -1, -1, S_W,    AF_WBRANCH,  0               },
  108.     {    "BNE",  OpBNE,  0x6600, -1, -1, -1, -1, -1, S_B,    AF_BBRANCH,  0               },
  109.     {    "BPL",  OpBPL,  0x6A00, -1, -1, -1, -1, -1, S_W,    AF_WBRANCH,  0               },
  110.     {    "BPL",  OpBPL,  0x6A00, -1, -1, -1, -1, -1, S_B,    AF_BBRANCH,  0               },
  111.     {    "BVC",  OpBVC,  0x6800, -1, -1, -1, -1, -1, S_W,    AF_WBRANCH,  0               },
  112.     {    "BVC",  OpBVC,  0x6800, -1, -1, -1, -1, -1, S_B,    AF_BBRANCH,  0               },
  113.     {    "BVS",  OpBVS,  0x6900, -1, -1, -1, -1, -1, S_W,    AF_WBRANCH,  0               },
  114.     {    "BVS",  OpBVS,  0x6900, -1, -1, -1, -1, -1, S_B,    AF_BBRANCH,  0               },
  115.  
  116.     /*        opcode     Temp    Rs  EAs Rd  EAd Siz Sizes  SModes    DModes      Spec# */
  117.  
  118.     {    "BCHG", OpBCHG, 0x0140,  9, -1,  0,  3, -1, S_B,    AF_DN,      AF_ALTM         },
  119.     {    "BCHG", OpBCHG, 0x0140,  9, -1,  0,  3, -1, S_L,    AF_DN,      AF_DN           },
  120.     {    "BCHG", OpBCHG, 0x0840, -1, -1,  0,  3, -1, S_B,    AF_IMM,     AF_ALTM , IMMB  },
  121.     {    "BCHG", OpBCHG, 0x0840, -1, -1,  0,  3, -1, S_L,    AF_IMM,     AF_DN   , IMMB  },
  122.     {    "BCLR", OpBCLR, 0x0180,  9, -1,  0,  3, -1, S_B,    AF_DN,      AF_ALTM         },
  123.     {    "BCLR", OpBCLR, 0x0180,  9, -1,  0,  3, -1, S_L,    AF_DN,      AF_DN           },
  124.     {    "BCLR", OpBCLR, 0x0880, -1, -1,  0,  3, -1, S_B,    AF_IMM,     AF_ALTM,  IMMB  },
  125.     {    "BCLR", OpBCLR, 0x0880, -1, -1,  0,  3, -1, S_L,    AF_IMM,     AF_DN  ,  IMMB  },
  126.  
  127.     {    "BRA",  OpBRA,  0x6000, -1, -1, -1, -1, -1, S_W,    AF_WBRANCH,  0              },
  128.     {    "BRA",  OpBRA,  0x6000, -1, -1, -1, -1, -1, S_B,    AF_BBRANCH,  0              },
  129.  
  130.     {    "BSET", OpBSET, 0x01C0,  9, -1,  0,  3, -1, S_B,    AF_DN,      AF_ALTM         },
  131.     {    "BSET", OpBSET, 0x01C0,  9, -1,  0,  3, -1, S_L,    AF_DN,      AF_DN           },
  132.     {    "BSET", OpBSET, 0x08C0, -1, -1,  0,  3, -1, S_B,    AF_IMM,     AF_ALTM, IMMB   },
  133.     {    "BSET", OpBSET, 0x08C0, -1, -1,  0,  3, -1, S_L,    AF_IMM,     AF_DN  , IMMB   },
  134.     {    "BTST", OpBTST, 0x0100,  9, -1,  0,  3, -1, S_B,    AF_DN,      AF_ALTM         },
  135.     {    "BTST", OpBTST, 0x0100,  9, -1,  0,  3, -1, S_L,    AF_DN,      AF_DN           },
  136.     {    "BTST", OpBTST, 0x0800, -1, -1,  0,  3, -1, S_B,    AF_IMM,     AF_ALTM, IMMB   },
  137.     {    "BTST", OpBTST, 0x0800, -1, -1,  0,  3, -1, S_L,    AF_IMM,     AF_DN  , IMMB   },
  138.  
  139.     /*        opcode     Temp    Rs  EAs Rd  EAd Siz Sizes  SModes    DModes      Spec# */
  140.  
  141.     {    "CHK",  OpCHK,  0x4180,  0,  3,  9, -1, -1, S_W,    AF_ALLNA,   AF_DN           },
  142.     {    "CLR",  OpCLR,  0x4200, -1, -1,  0,  3,  6, S_ALL,  0,          AF_ALTNA        },
  143.     {    "CMP",  OpCMP,  0xB000,  0,  3,  9, -1,  6, S_ALL,  AF_ALLNA,   AF_DN           },
  144.     {    "CMP",  OpCMP,  0xB000,  0,  3,  9, -1,  6, S_WL,   AF_AN,      AF_DN           },
  145.     {    "CMPA", OpCMP,  0xB0C0,  0,  3,  9, -1, -1, S_W,    AF_ALL,     AF_AN           },
  146.     {    "CMPA", OpCMP,  0xB1C0,  0,  3,  9, -1, -1, S_L,    AF_ALL,     AF_AN           },
  147.     {    "CMPI", OpCMP,  0x0C00, -1, -1,  0,  3,  6, S_ALL,  AF_IMM,     AF_ALTNA        },
  148.     {    "CMPM", OpCMP,  0xB108,  0, -1,  9, -1,  6, S_ALL,  AF_INDPP,   AF_INDPP        },
  149.  
  150.     {    "DBCC", OpDBcc, 0x54C8,  0, -1, -1, -1, -1, S_W,    AF_DN,      AF_WBRANCH       },
  151.     {    "DBCS", OpDBcc, 0x55C8,  0, -1, -1, -1, -1, S_W,    AF_DN,      AF_WBRANCH       },
  152.     {    "DBEQ", OpDBcc, 0x57C8,  0, -1, -1, -1, -1, S_W,    AF_DN,      AF_WBRANCH       },
  153.     {    "DBF" , OpDBcc, 0x51C8,  0, -1, -1, -1, -1, S_W,    AF_DN,      AF_WBRANCH       },
  154.     {    "DBGE", OpDBcc, 0x5CC8,  0, -1, -1, -1, -1, S_W,    AF_DN,      AF_WBRANCH       },
  155.     {    "DBGT", OpDBcc, 0x5EC8,  0, -1, -1, -1, -1, S_W,    AF_DN,      AF_WBRANCH       },
  156.     {    "DBHI", OpDBcc, 0x52C8,  0, -1, -1, -1, -1, S_W,    AF_DN,      AF_WBRANCH       },
  157.     {    "DBLE", OpDBcc, 0x5FC8,  0, -1, -1, -1, -1, S_W,    AF_DN,      AF_WBRANCH       },
  158.     {    "DBLS", OpDBcc, 0x53C8,  0, -1, -1, -1, -1, S_W,    AF_DN,      AF_WBRANCH       },
  159.     {    "DBLT", OpDBcc, 0x5DC8,  0, -1, -1, -1, -1, S_W,    AF_DN,      AF_WBRANCH       },
  160.     {    "DBMI", OpDBcc, 0x5BC8,  0, -1, -1, -1, -1, S_W,    AF_DN,      AF_WBRANCH       },
  161.     {    "DBNE", OpDBcc, 0x56C8,  0, -1, -1, -1, -1, S_W,    AF_DN,      AF_WBRANCH       },
  162.     {    "DBPL", OpDBcc, 0x5AC8,  0, -1, -1, -1, -1, S_W,    AF_DN,      AF_WBRANCH       },
  163.     {    "DBT" , OpDBcc, 0x50C8,  0, -1, -1, -1, -1, S_W,    AF_DN,      AF_WBRANCH       },
  164.     {    "DBVC", OpDBcc, 0x58C8,  0, -1, -1, -1, -1, S_W,    AF_DN,      AF_WBRANCH       },
  165.     {    "DBVS", OpDBcc, 0x59C8,  0, -1, -1, -1, -1, S_W,    AF_DN,      AF_WBRANCH       },
  166.  
  167.     /*        opcode     Temp    Rs  EAs Rd  EAd Siz Sizes  SModes    DModes      Spec# */
  168.  
  169.     {    "DIVS", OpDIVS, 0x81C0,  0,  3,  9, -1, -1, S_W,    AF_ALLNA,   AF_DN           },
  170.     {    "DIVS", OpDIVS, 0x4C40,  0,  3, -1, -1, -1, S_L,    AF_ALLNA,   AF_DN|AF_MULDREGS},  /*  020 */
  171.     {    "DIVU", OpDIVU, 0x80C0,  0,  3,  9, -1, -1, S_W,    AF_ALLNA,   AF_DN           },
  172.     {    "DIVU", OpDIVU, 0x4C40,  0,  3, -1, -1, -1, S_L,    AF_ALLNA,   AF_DN|AF_MULDREGU},  /*  020 */
  173.               
  174.  
  175.     {    "EOR",  OpEOR,  0xB100,  9, -1,  0,  3,  6, S_ALL,  AF_DN,      AF_ALTNA        },
  176.     {    "EORI", OpEOR,  0x0A00, -1, -1,  0,  3,  6, S_ALL,  AF_IMM,     AF_ALTNA        },
  177.     {    "EORI", OpEOR,  0x0A3C, -1, -1, -1, -1, -1, S_B,    AF_IMM,     AF_CCR          },
  178.     {    "EORI", OpEOR,  0x0A7C, -1, -1, -1, -1, -1, S_W,    AF_IMM,     AF_SR           },
  179.     {    "EXG",  OpEXG,  0xC140,  9, -1,  0, -1, -1, S_L,    AF_DN,      AF_DN           },
  180.     {    "EXG",  OpEXG,  0xC148,  9, -1,  0, -1, -1, S_L,    AF_AN,      AF_AN           },
  181.     {    "EXG",  OpEXG,  0xC188,  9, -1,  0, -1, -1, S_L,    AF_DN,      AF_AN           },
  182.     {    "EXG",  OpEXG,  0xC188,  0, -1,  9, -1, -1, S_L,    AF_AN,      AF_DN           },
  183.     {    "EXT",  OpEXT,  0x4880, -1, -1,  0, -1, -1, S_W,    0,          AF_DN           },
  184.     {    "EXT",  OpEXT,  0x48C0, -1, -1,  0, -1, -1, S_L,    0,          AF_DN           },
  185.     {    "EXTB", OpEXTB, 0x49C0, -1, -1,  0, -1, -1, S_L,    0,          AF_DN           },
  186.     {    "ILLEGAL", OpILLEGAL,
  187.  
  188.     /*
  189.      *    note: BSR/BSR/JSR ordering must remain as it is (passc.c optimizations)
  190.      */
  191.             0x4AFC, -1, -1, -1, -1, -1, 0,        0,        0        },
  192.     {    "JMP",  OpJMP,  0x4EC0,  0,  3, -1, -1, -1, 0,      AF_CTL,     0               },
  193.     {    "BSR",  OpBSR,  0x6100, -1, -1, -1, -1, -1, S_W,    AF_WBRANCH,  0              },
  194.     {    "BSR",  OpBSR,  0x6100, -1, -1, -1, -1, -1, S_B,    AF_BBRANCH,  0              },
  195.     {    "JSR",  OpJSR,  0x4E80,  0,  3, -1, -1, -1, 0,      AF_CTL,     0               },
  196.  
  197.     {    "LEA",  OpLEA,  0x41C0,  0,  3,  9, -1, -1, S_L,    AF_CTL,     AF_AN           },
  198.     {    "LINK", OpLINK, 0x4E50,  0, -1, -1, -1, -1, S_W,    AF_AN,      AF_IMM          },
  199.  
  200.     /*        opcode     Temp    Rs  EAs Rd  EAd Siz Sizes  SModes    DModes      Spec# */
  201.  
  202.     {    "LSL",  OpLSL,  0xE128,  9, -1,  0, -1,  6, S_ALL,  AF_DN,      AF_DN           },
  203.     {    "LSL",  OpLSL,  0xE108, -1, -1,  0, -1,  6, S_ALL,  AF_IMM,     AF_DN   , IMM18 },
  204.     {    "LSL",  OpLSL,  0xE3C0, -1, -1,  0,  3, -1, S_W,    0,          AF_ALTM         },
  205.     {    "LSR",  OpLSR,  0xE028,  9, -1,  0, -1,  6, S_ALL,  AF_DN,      AF_DN           },
  206.     {    "LSR",  OpLSR,  0xE008, -1, -1,  0, -1,  6, S_ALL,  AF_IMM,     AF_DN   , IMM18 },
  207.     {    "LSR",  OpLSR,  0xE2C0, -1, -1,  0,  3, -1, S_W,    0,          AF_ALTM         },
  208.  
  209.     {    "MOVE", OpMOVE, 0x2000,  0,  3,  9,  6, -1, S_L,    AF_ALLNA,   AF_ALTNA        },
  210.     {    "MOVE", OpMOVE, 0x3000,  0,  3,  9,  6, -1, S_W,    AF_ALLNA,   AF_ALTNA        },
  211.     {    "MOVE", OpMOVE, 0x1000,  0,  3,  9,  6, -1, S_B,    AF_ALLNA,   AF_ALTNA        },
  212.     {    "MOVE", OpMOVE, 0x2000,  0,  3,  9,  6, -1, S_L,    AF_AN,      AF_ALTNA        },
  213.     {    "MOVE", OpMOVE, 0x3000,  0,  3,  9,  6, -1, S_W,    AF_AN,      AF_ALTNA        },
  214.  
  215.   /* 68010
  216.    *{    "MOVE", OpMOVE, 0x42C0, -1, -1,  0,  3, -1, S_W,    AF_CCR,     AF_ALTNA        },
  217.    */
  218.  
  219.     {    "MOVE", OpMOVE, 0x44C0,  0,  3, -1, -1, -1, S_W,    AF_ALLNA,   AF_CCR          },
  220.     {    "MOVE", OpMOVE, 0x46C0,  0,  3, -1, -1, -1, S_W,    AF_ALLNA,   AF_SR           },
  221.     {    "MOVE", OpMOVE, 0x40C0, -1, -1,  0,  3, -1, S_W,    AF_SR,      AF_ALTNA        },
  222.     {    "MOVEA",OpMOVE, 0x3040,  0,  3,  9, -1, -1, S_W,    AF_ALL,     AF_AN           },
  223.     {    "MOVEA",OpMOVE, 0x2040,  0,  3,  9, -1, -1, S_L,    AF_ALL,     AF_AN           },
  224.     {    "MOVEA",OpMOVE, 0x4E68, -1, -1,  0, -1, -1, S_L,    AF_USP,     AF_AN           },
  225.     {    "MOVEA",OpMOVE, 0x4E60,  0, -1, -1, -1, -1, S_L,    AF_AN,      AF_USP          },
  226.     /* MOVEC 68010  */
  227.     {    "MOVEM",OpMOVEM,0x48C0, -1, -1,  0,  3, -1, S_L,    AF_REGS,    AF_CTL|AF_MMIND },
  228.     {    "MOVEM",OpMOVEM,0x4880, -1, -1,  0,  3, -1, S_W,    AF_REGS,    AF_CTL|AF_MMIND },
  229.     {    "MOVEM",OpMOVEM,0x4CC0,  0,  3, -1, -1, -1, S_L,    AF_CTL|AF_INDPP,    AF_REGS },
  230.     {    "MOVEM",OpMOVEM,0x4C80,  0,  3, -1, -1, -1, S_W,    AF_CTL|AF_INDPP,    AF_REGS },
  231.     {    "MOVEP",OpMOVEP,0x0188,  9, -1,  0, -1, -1, S_W,    AF_DN,      AF_OFFAN        },
  232.     {    "MOVEP",OpMOVEP,0x01C8,  9, -1,  0, -1, -1, S_L,    AF_DN,      AF_OFFAN        },
  233.     {    "MOVEP",OpMOVEP,0x0108,  0, -1,  9, -1, -1, S_W,    AF_OFFAN,   AF_DN           },
  234.     {    "MOVEP",OpMOVEP,0x0148,  0, -1,  9, -1, -1, S_L,    AF_OFFAN,   AF_DN           },
  235.     /*    MOVES    68010    */
  236.     {    "MOVEQ",OpMOVEQ,0x7000, -1, -1,  9, -1, -1, S_L,    AF_IMM,     AF_DN   , IMM256},
  237.  
  238.     /*        opcode     Temp    Rs  EAs Rd  EAd Siz Sizes  SModes    DModes      Spec# */
  239.  
  240.     {    "MULS", OpMULS, 0xC1C0,  0,  3,  9, -1, -1, S_W,    AF_ALLNA,   AF_DN           },
  241.     {    "MULS", OpMULS, 0x4C00,  0,  3, -1, -1, -1, S_L,    AF_ALLNA,   AF_DN|AF_MULDREGS},  /*  020 */
  242.     {    "MULU", OpMULU, 0xC0C0,  0,  3,  9, -1, -1, S_W,    AF_ALLNA,   AF_DN           },
  243.     {    "MULU", OpMULU, 0x4C00,  0,  3, -1, -1, -1, S_L,    AF_ALLNA,   AF_DN|AF_MULDREGU},  /*  020 */
  244.     {    "NBCD", OpNBCD, 0x4800, -1, -1,  0,  3, -1, S_B,    0,          AF_ALTNA        },
  245.     {    "NEG",  OpNEG,  0x4400, -1, -1,  0,  3,  6, S_ALL,  0,          AF_ALTNA        },
  246.     {    "NEGX", OpNEGX, 0x4000, -1, -1,  0,  3,  6, S_ALL,  0,          AF_ALTNA        },
  247.     {    "NOP",  OpNOP,  0x4E71, -1, -1, -1, -1, -1, 0,      0,          0               },
  248.     {    "NOT",  OpNOT,  0x4600, -1, -1,  0,  3,  6, S_ALL,  0,          AF_ALTNA        },
  249.  
  250.     {    "OR",   OpOR,   0x8000,  0,  3,  9, -1,  6, S_ALL,  AF_ALLNA,   AF_DN           },
  251.     {    "OR",   OpOR,   0x8100,  9, -1,  0,  3,  6, S_ALL,  AF_DN,      AF_ALTNA        },
  252.     {    "ORI",  OpOR,   0x0000, -1, -1,  0,  3,  6, S_ALL,  AF_IMM,     AF_ALTNA        },
  253.     {    "ORI",  OpOR,   0x003C, -1, -1, -1, -1, -1, S_B,    AF_IMM,     AF_CCR          },
  254.     {    "ORI",  OpOR,   0x007C, -1, -1, -1, -1, -1, S_W,    AF_IMM,     AF_SR           },
  255.     {    "PEA",  OpPEA,  0x4840,  0,  3, -1, -1, -1, S_L,    AF_CTL,     0               },
  256.     {    "RESET",OpRESET,0x4E70, -1, -1, -1, -1, -1, 0,      0,          0               },
  257.  
  258.     /*        opcode     Temp    Rs  EAs Rd  EAd Siz Sizes  SModes    DModes      Spec# */
  259.  
  260.     {    "ROL",  OpROL,  0xE138,  9, -1,  0, -1,  6, S_ALL,  AF_DN,      AF_DN           },
  261.     {    "ROL",  OpROL,  0xE118, -1, -1,  0, -1,  6, S_ALL,  AF_IMM,     AF_DN   , IMM18 },
  262.     {    "ROL",  OpROL,  0xE7C0, -1, -1,  0,  3, -1, S_W,    0,          AF_ALTM         },
  263.     {    "ROR",  OpROR,  0xE038,  9, -1,  0, -1,  6, S_ALL,  AF_DN,      AF_DN           },
  264.     {    "ROR",  OpROR,  0xE018, -1, -1,  0, -1,  6, S_ALL,  AF_IMM,     AF_DN   , IMM18 },
  265.     {    "ROR",  OpROR,  0xE6C0, -1, -1,  0,  3, -1, S_W,    0,          AF_ALTM         },
  266.  
  267.     {    "ROXL", OpROXL, 0xE130,  9, -1,  0, -1,  6, S_ALL,  AF_DN,      AF_DN           },
  268.     {    "ROXL", OpROXL, 0xE110, -1, -1,  0, -1,  6, S_ALL,  AF_IMM,     AF_DN   , IMM18 },
  269.     {    "ROXL", OpROXL, 0xE5C0, -1, -1,  0,  3, -1, S_W,    0,          AF_ALTM         },
  270.     {    "ROXR", OpROXR, 0xE030,  9, -1,  0, -1,  6, S_ALL,  AF_DN,      AF_DN           },
  271.     {    "ROXR", OpROXR, 0xE010, -1, -1,  0, -1,  6, S_ALL,  AF_IMM,     AF_DN   , IMM18 },
  272.     {    "ROXR", OpROXR, 0xE4C0, -1, -1,  0,  3, -1, S_W,    0,          AF_ALTM         },
  273.  
  274.     /*    RTD 68010   */
  275.     {    "RTE",  OpRTE,  0x4E73, -1, -1, -1, -1, -1, 0,      0,          0               },
  276.     {    "RTR",  OpRTR,  0x4E77, -1, -1, -1, -1, -1, 0,      0,          0               },
  277.     {    "RTS",  OpRTS,  0x4E75, -1, -1, -1, -1, -1, 0,      0,          0               },
  278.     {    "SBCD", OpSBCD, 0x8100,  0, -1,  9, -1, -1, S_B,    AF_DN,      AF_DN           },
  279.     {    "SBCD", OpSBCD, 0x8108,  0, -1,  9, -1, -1, S_B,    AF_MMIND,   AF_MMIND        },
  280.  
  281.     /*        opcode     Temp    Rs  EAs Rd  EAd Siz Sizes  SModes    DModes      Spec# */
  282.  
  283.     /* SCC note, even though they are in the same group since all have the
  284.      * same note if one isn't accepted none of the others will be either
  285.      */
  286.  
  287.     {    "SCC",  OpScc,  0x54C0, -1, -1,  0,  3, -1, S_B,    0,          AF_ALTNA        },
  288.     {    "SCS",  OpScc,  0x55C0, -1, -1,  0,  3, -1, S_B,    0,          AF_ALTNA        },
  289.     {    "SEQ",  OpScc,  0x57C0, -1, -1,  0,  3, -1, S_B,    0,          AF_ALTNA        },
  290.     {    "SF",   OpScc,  0x51C0, -1, -1,  0,  3, -1, S_B,    0,          AF_ALTNA        },
  291.     {    "SGE",  OpScc,  0x5CC0, -1, -1,  0,  3, -1, S_B,    0,          AF_ALTNA        },
  292.     {    "SGT",  OpScc,  0x5EC0, -1, -1,  0,  3, -1, S_B,    0,          AF_ALTNA        },
  293.     {    "SHI",  OpScc,  0x52C0, -1, -1,  0,  3, -1, S_B,    0,          AF_ALTNA        },
  294.     {    "SLE",  OpScc,  0x5FC0, -1, -1,  0,  3, -1, S_B,    0,          AF_ALTNA        },
  295.     {    "SLS",  OpScc,  0x53C0, -1, -1,  0,  3, -1, S_B,    0,          AF_ALTNA        },
  296.     {    "SLT",  OpScc,  0x5DC0, -1, -1,  0,  3, -1, S_B,    0,          AF_ALTNA        },
  297.     {    "SMI",  OpScc,  0x5BC0, -1, -1,  0,  3, -1, S_B,    0,          AF_ALTNA        },
  298.     {    "SNE",  OpScc,  0x56C0, -1, -1,  0,  3, -1, S_B,    0,          AF_ALTNA        },
  299.     {    "SPL",  OpScc,  0x5AC0, -1, -1,  0,  3, -1, S_B,    0,          AF_ALTNA        },
  300.     {    "ST" ,  OpScc,  0x50C0, -1, -1,  0,  3, -1, S_B,    0,          AF_ALTNA        },
  301.     {    "SVC",  OpScc,  0x58C0, -1, -1,  0,  3, -1, S_B,    0,          AF_ALTNA        },
  302.     {    "SVS",  OpScc,  0x59C0, -1, -1,  0,  3, -1, S_B,    0,          AF_ALTNA        },
  303.  
  304.     /*        opcode     Temp    Rs  EAs Rd  EAd Siz Sizes  SModes    DModes      Spec# */
  305.  
  306.     {    "STOP", OpSTOP, 0x4E72, -1, -1, -1, -1, -1, S_W,    AF_IMM,     0               },
  307.  
  308.     {    "SUB",  OpSUB,  0x9000, 0,   3, 9,  -1,  6, S_ALL,  AF_ALL,     AF_DN           },
  309.     {    "SUB",  OpSUB,  0x9100, 9,  -1, 0,   3,  6, S_ALL,  AF_DN,      AF_ALTM         },
  310.     {    "SUBA", OpSUB,  0x90C0, 0,   3, 9,  -1, -1, S_W,    AF_ALL,     AF_AN           },
  311.     {    "SUBA", OpSUB,  0x91C0, 0,   3, 9,  -1, -1, S_L,    AF_ALL,     AF_AN           },
  312.     {    "SUBI", OpSUB,  0x0400, -1, -1, 0,   3,  6, S_ALL,  AF_IMM,     AF_ALTNA        },
  313.     {    "SUBQ", OpSUBQ, 0x5100, -1, -1, 0,   3,  6, S_ALL,  AF_IMM,     AF_ALT  ,  IMM18},
  314.     {    "SUBX", OpSUBX, 0x9100, 0,  -1, 9,  -1,  6, S_ALL,  AF_DN,      AF_DN           },
  315.     {    "SUBX", OpSUBX, 0x9108, 0,  -1, 9,  -1,  6, S_ALL,  AF_MMIND,   AF_MMIND        },
  316.  
  317.     {    "SWAP", OpSWAP, 0x4840, -1, -1, 0,  -1, -1, S_W,    0,          AF_DN           },
  318.     {    "TAS",  OpTAS,  0x4AC0, -1, -1, 0,   3, -1, S_B,    0,          AF_ALTNA        },
  319.     {    "TRAP", OpTRAP, 0x4E40, -1, -1, -1, -1, -1, 0,      AF_IMM,     0       , IMM0F },
  320.     {    "TRAPV",OpTRAPV,0x4E76, -1, -1, -1, -1, -1, 0,      0,          0               },
  321.     {    "TST",  OpTST,  0x4A00,  0,  3, -1, -1,  6, S_ALL,  AF_ALTNA,   0               },
  322.     {    "UNLK", OpUNLK, 0x4E58, -1, -1, 0,  -1, -1, 0,      0,          AF_AN           },
  323.  
  324.     {    "EQU",  OdEQU   },
  325.     {    "REG",  OdREG   },
  326.     {    "XREF", OdXREF  },
  327.     {    "XDEF", OdXDEF  },
  328.     {    "SECTION",
  329.         OdSECTION },
  330.     {    "DS",   OdDS    },
  331.     {    "DC",   OdDC    },
  332.     {    "END",  OdEND   },
  333.     {    "PROCSTART", OdPROCSTART },
  334.     {    "PROCEND"  , OdPROCEND   },
  335.     {    "MC68020"  , OdMC68020   },
  336.     {    "MC68881"  , OdMC68881   },
  337.     {    "DEBUG"    , OdDEBUG     },
  338.     {    "ALIGN"       , OdALIGN     },
  339.     {    NULL }
  340.  
  341. };
  342.  
  343. #ifndef DISOBJ_C
  344.  
  345. int
  346. ophash(str)
  347. ubyte *str;
  348. {
  349.     long hv = 0x1B465D8;
  350.  
  351.     while (*str)
  352.     hv = (hv >> 23) ^ (hv << 5) ^ *str++;
  353.     return(hv & OMASK);
  354. }
  355.  
  356. void
  357. InitOps()
  358. {
  359.     OpCod *oc;
  360.     OpCod *ocn;
  361.  
  362.     for (oc = Codes; oc->OpName; ++oc) {
  363.     long hv = ophash(oc->OpName);
  364.  
  365.     oc->HNext = OHash[hv];
  366.     OHash[hv] = oc;
  367.  
  368.     for (ocn = oc + 1; ocn->OpName && strcmp(oc->OpName, ocn->OpName) == 0; ++oc, ++ocn) {
  369.         oc->SibNext = ocn;
  370.     }
  371.  
  372.     if (ocn->OpName && ocn->Id == oc->Id)
  373.         oc->SibNext = ocn;
  374.     }
  375. }
  376.  
  377. OpCod *
  378. GetOpByName(name)
  379. char *name;
  380. {
  381.     OpCod *oc;
  382.     long hv = ophash(name);
  383.  
  384.     for (oc = OHash[hv]; oc && strcmp(name, oc->OpName) != 0; oc = oc->HNext);
  385.     return(oc);
  386. }
  387.  
  388. /*
  389.  *  callable after passb, returns size in bytes
  390.  */
  391.  
  392. short
  393. GetInstSize(mc)
  394. MachCtx *mc;
  395. {
  396.     short i = ExtWords[(short)mc->Oper1.Mode1];
  397.     short j = ExtWords[(short)mc->Oper2.Mode1];
  398.     short opsize = mc->OpSize;        /*    used only if IMM mode */
  399.  
  400.     if (opsize == 0) {
  401.     OpCod *oc = mc->OpCode;
  402.     if (oc->Sizes & S_B)
  403.         opsize = 1;
  404.     if (oc->Sizes & S_W)
  405.         opsize = 2;
  406.     if (oc->Sizes & S_L)
  407.         opsize = 4;
  408.     }
  409.  
  410.     if (mc->OpCode == NULL)
  411.         return(2);
  412.  
  413.     if (i == -1) {          /*  imm/branch  */
  414.     if (mc->OpCode->Special == IMMB)
  415.         i = 1;
  416.     else if (mc->OpCode->Special || (mc->OpCode->SModes & AF_BBRANCH))
  417.         i = 0;
  418.     else
  419.         i = (opsize + 1) >> 1;  /* 1 for bw, 2 for long */
  420.     } else if (i == -2) {   /*  index mode  */
  421.     i = 1;
  422.     if (mc->Oper1.ExtWord & EXTF_FULL) {
  423.         switch(mc->Oper1.ExtWord & EXTF_BDMASK) {
  424.         case EXTF_BDLONG:
  425.         ++i;
  426.         case EXTF_BDWORD:
  427.         ++i;
  428.         break;
  429.         }
  430.         switch(mc->Oper1.ExtWord & EXTF_ODMASK) {
  431.         case EXTF_ODLONG:
  432.         ++i;
  433.         case EXTF_ODWORD:
  434.         ++i;
  435.         break;
  436.         }
  437.     }
  438.     }
  439.     if (j == -1) {          /*  imm/branch  */
  440.     if (mc->OpCode->Special == IMMB)
  441.         j = 1;
  442.     else if (mc->OpCode->Special)
  443.         j = 0;
  444.     else
  445.         j = (opsize + 1) >> 1;  /* 1 for bw, 2 for long */
  446.     } else if (j == -2) {   /*  index mode  */
  447.     j = 1;
  448.     if (mc->Oper2.ExtWord & EXTF_FULL) {
  449.         switch(mc->Oper2.ExtWord & EXTF_BDMASK) {
  450.         case EXTF_BDLONG:
  451.         ++j;
  452.         case EXTF_BDWORD:
  453.         ++j;
  454.         break;
  455.         }
  456.         switch(mc->Oper2.ExtWord & EXTF_ODMASK) {
  457.         case EXTF_ODLONG:
  458.         ++j;
  459.         case EXTF_ODWORD:
  460.         ++j;
  461.         break;
  462.         }
  463.     }
  464.     }
  465.     if (mc->OpCode->DModes & (AF_MULDREGS|AF_MULDREGU))    /* XXX MULx.L, DIVx.L */
  466.     ++j;
  467.     dbprintf(0, ("line %ld opcode %s size (%dw,%dw)%d\n", LineNo, mc->OpCode->OpName, i, j, (1 + i + j) * 2));
  468.     return((short)((1 + i + j) << 1));
  469. }
  470.  
  471. /*
  472.  *  NOTE:   For #IMM and byte-branch modes this call only works if the
  473.  *        extension occurs directly after the instruction.
  474.  *
  475.  *        For indexing modes this call works for either src or dst
  476.  *
  477.  *        returns number of extension words, location and type
  478.  *        of relocation.
  479.  */
  480.  
  481. #ifdef NOTDEF
  482.  
  483. short
  484. GetSpecDataSize(mc, oc, ea, poff)
  485. MachCtx *mc;
  486. OpCod *oc;
  487. EffAddr *ea;
  488. long *poff;
  489. {
  490.     short opsize;
  491.     *poff = 0;
  492.  
  493.     if (ea->Mode1 == AB_BBRANCH) {
  494.     *poff = -1;        /*    relocate back into instruction */
  495.     return(1);          /*  size is byte                   */
  496.     }
  497.     if (ea->Mode1 == AB_OFFIDX || ea->Mode1 == AB_OFFIDXPC) {
  498.     if (ea->ExtWord & EXTF_FULL) {
  499.         int r = 1;
  500.  
  501.         switch(ea->ExtWord & EXTF_ODMASK) {
  502.         case EXTF_ODLONG:
  503.         ++r;
  504.         case EXTF_ODWORD:
  505.         ++r;
  506.         break;
  507.         }
  508.  
  509.         switch(ea->ExtWord & EXTF_BDMASK) {
  510.         case EXTF_BDLONG:
  511.         ++r;
  512.         case EXTF_BDWORD:
  513.         ++r;
  514.         break;
  515.         }
  516.         return(r);
  517.     }
  518.     return(1);
  519.     }
  520.     if (oc->Special) {
  521.     if (oc->Special == IMMB) {
  522.         *poff = 1;        /*    relocate half way through next word */
  523.         return(1);      /*  size is byte                    */
  524.     }
  525.     if (oc->Special == IMM256) {
  526.         *poff = -1;     /*    as in moveq, item back in inst. */
  527.         return(1);
  528.     }
  529.     return(0);          /*  not relocatable     */
  530.     }
  531.     opsize = mc->OpSize;    /*    opsize unspecified and #imm mode..  */
  532.     if (opsize == 0) {
  533.     if (oc->Sizes & S_B)
  534.         opsize = 1;
  535.     if (oc->Sizes & S_W)
  536.         opsize = 2;
  537.     if (oc->Sizes & S_L)
  538.         opsize = 4;
  539.     }
  540.     switch(opsize) {
  541.     case 1:
  542.     *poff = 1;        /*    offset one from word    */
  543.     return(1);          /*  byte relocation */
  544.     case 2:
  545.     return(2);          /*  word relocation */
  546.     case 4:
  547.     return(4);          /*  long relocation */
  548.     }
  549.     cerror(ESOFTWARN_BAD_OP_SIZE, mc->OpSize);
  550. }
  551. #endif
  552.  
  553.  
  554. #endif
  555.